Dette er et eksempel på hvordan vi kan distribuere datajournalistikk til lokalaviser.
Det er laget med Quarto, og Observable JS.
Løsningen gir mulighet for å samhandle med datagrunnlaget, og lage visualiseringer tilpasset den enkelte bruker.
I dette eksempelet er det lastet inn data fra SSB. Ved å bruke menyvelgerne kan man selektere hvilke aldersgruppe man ønsker å visualisere, og hvilke kommuner som skal inngå i sammenligningen.
---title: "Test av distribusjonsmetode"format: html: code-fold: false code-tools: trueexecute: echo: falseeditor: visual---## GjennomsnittspersonenDette er et eksempel på hvordan vi kan distribuere datajournalistikk til lokalaviser.Det er laget med Quarto, og Observable JS.Løsningen gir mulighet for å samhandle med datagrunnlaget, og lage visualiseringer tilpasset den enkelte bruker.I dette eksempelet er det lastet inn data fra SSB. Ved å bruke menyvelgerne kan man selektere hvilke aldersgruppe man ønsker å visualisere, og hvilke kommuner som skal inngå i sammenligningen.```{r echo=FALSE, message=FALSE, warnings=FALSE}library(tidyverse)df <-read_csv2("data/07459_20240201-095258.csv")df <- df |>mutate(region =iconv(region, "latin1", "utf-8"),alder =as.numeric(str_replace(alder," .*$", "")),kommnr =str_replace(region, " .*$", ""),kommnavn =str_replace(region, ".*? ", "") ) |>rename(n = Persone) |>group_by(kommnr, kjonn) |>mutate(pct = n/sum(n) ) |>ungroup()averages <- df |>mutate(age_sum = n * alder, ) |>group_by(kommnr, kommnavn, kjonn) |>mutate(age_mean =round(sum(age_sum)/sum(n),1), ) |>distinct(age_mean) |>ungroup()all_komms <- df |>distinct(kommnr, kommnavn)ojs_define(data = df)ojs_define(data_averages = averages)ojs_define(all_komms = all_komms)#print(all_komms)``````{ojs}//| output: falsefiltered =transpose(data).filter(function(komm) {return alder_min < komm.alder&& kommuner.includes(komm.kommnavn);})filtered_averages =transpose(data_averages).filter(function(komm) {return alder_min < komm.age_mean&& kommuner.includes(komm.kommnavn);})``````{ojs}#|.sidebarviewof alder_min = Inputs.range( [0,100], {value:0,step:1,label:"Alder min:"})viewof kommuner = Inputs.select( all_komms.kommnavn, { label:"Kommuner:",multiple:true,value:"K-3101"//format: x => x.name, value: teams.find(t => t.name === "K-4601") })```## Plot```{ojs}#| echo:falsePlot.plot({marginBottom:60,x: {tickRotate:-30, },//y: {// transform: (d) => d / 1000,// label: "↑ Market value (US dollars, billions)",// grid: 5//},facet: {data: filtered,x:"kjonn",y:"kommnavn",marginRight:80 },marks: [ Plot.ruleY([0]), Plot.barY(filtered, {x:"alder",y:"pct",sort: { x:"y",reverse:true,limit:100},fill:"steelblue" }), ]})```# Tabell```{ojs}Inputs.table(filtered_averages)```